package org.example.heap;

import java.util.concurrent.TimeUnit;

/**
 * 1. 设置堆空间大小的参数-Xms 用来设置堆空间(年轻代+老年代)的初始内存大小
 *      -X 是jvm 的运行参数ms 是memory start
 *      -Xmx 用来设置堆空间 (年轻代+ 老年代)的最大内存大小
 * 2. 默认堆空间大小
 *  初始内存大小：物理电脑内存大小 / 64
 *  最大内存大小：物理电脑内存大小 / 4
 * 3. 手动设置：-Xms600m -Xmx600m
 *  开发中建议建议将初始堆内存和最大的堆内存设置成相同的值
 *
 ----------------------------------------------------------------------------------------------------------------------
 ➜  ~ jps
 1280 RemoteMavenServer36
 33881 HeapSpaceInitial
 1310 Jps
 1279 Launcher

 ➜  ~ jstat -gc 33881
 S0C     S1C       S0U    S1U   EC       EU        OC           OU       MC     MU    CCSC   CCSU      YGC   YGCT    FGC    FGCT     GCT
 25600.0 25600.0  0.0    0.0   153600.0 15360.5   409600.0     0.0     4480.0 779.9  384.0   76.4       0    0.000   0      0.000    0.000
 ----------------------------------------------------------------------------------------------------------------------
 * 4. 查看设置的参数：
 *  方式一：jps / jstat -gc pid
 *  方式二： -XX:+PrintGCDetails
 *
 * @author youshang
 * @date 2022/03/21 17:14
 **/
public class HeapSpaceInitial {
    public static void main(String[] args) {
        //返回Java虚拟机中的堆内存总量
        long initialMemory = Runtime.getRuntime().freeMemory() / 1024 / 1024;
        //返回Java虚拟机试图使用的最大堆内存量
        long maxMemory = Runtime.getRuntime().maxMemory() / 1024 / 1024;

        System.out.println("-Xms : "+ initialMemory + "M");
        System.out.println("-Xmx : "+ maxMemory + "M");
        // jstat -gc 33881 得到的结果集
        //S0C (Survivor 0) + S1C (Survivor 1) + EC (Eden) + OC (Old) 注意：Survivor 区只会有一个启用

        try {
            TimeUnit.SECONDS.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
